Skip to content

gh-143990: Preserve the size when creating a Font from a named font#153267

Merged
serhiy-storchaka merged 2 commits into
python:mainfrom
serhiy-storchaka:gh-143990-font-configure
Jul 8, 2026
Merged

gh-143990: Preserve the size when creating a Font from a named font#153267
serhiy-storchaka merged 2 commits into
python:mainfrom
serhiy-storchaka:gh-143990-font-configure

Conversation

@serhiy-storchaka

@serhiy-storchaka serhiy-storchaka commented Jul 7, 2026

Copy link
Copy Markdown
Member

When a tkinter.font.Font is created from another font, Font.__init__ expanded it into concrete options with Tcl's font actual. For a named font this resolves the configured size, so a size specified in pixels (a negative size) was silently converted to a size in points (gh-143990).

font configure returns the configured options and preserves such a size, but it only accepts a font name, not a font description. So the font is now expanded with font configure when it is a named font, falling back to font actual when it is a font description:

try:
    font = tk.splitlist(tk.call("font", "configure", font))
except tkinter.TclError:
    font = tk.splitlist(tk.call("font", "actual", font))

Trying font configure first delegates the "is this a named font?" decision to Tcl, which is robust even for font names containing spaces.

A font description (a tuple or a string) is still resolved via font actual, since there is no way to parse it into options otherwise; wrapping it with exists=True (gh-143990, #152025) remains the way to use it without loss of precision.

Font.copy() has always been equivalent to constructing a Font from the original font (both went through font actual), so it is updated to match and now preserves the size too.

This is the general form of #143992, which restored the size only for a size given in a tuple.

…font

tkinter.font.Font now copies the options of a named font (via "font
configure") instead of the options resolved by "font actual", which
would resolve a size specified in pixels (a negative size) to points.
A font description is still resolved, as it cannot be parsed otherwise.

Font.copy(), which has always been equivalent to constructing a Font
from the original font, is updated to match and now preserves the size
too.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@serhiy-storchaka serhiy-storchaka force-pushed the gh-143990-font-configure branch from 987b4c2 to ae1f4a7 Compare July 7, 2026 17:36
@serhiy-storchaka serhiy-storchaka merged commit 45010f4 into python:main Jul 8, 2026
50 of 51 checks passed
@miss-islington-app

Copy link
Copy Markdown

Thanks @serhiy-storchaka for the PR 🌮🎉.. I'm working now to backport this PR to: 3.15.
🐍🍒⛏🤖

@serhiy-storchaka serhiy-storchaka deleted the gh-143990-font-configure branch July 8, 2026 08:30
@miss-islington-app

Copy link
Copy Markdown

Sorry, @serhiy-storchaka, I could not cleanly backport this to 3.15 due to a conflict.
Please backport using cherry_picker on command line.

cherry_picker 45010f441d392558f1be8f3cea7d86954ed2217d 3.15

@bedevere-app

bedevere-app Bot commented Jul 8, 2026

Copy link
Copy Markdown

GH-153323 is a backport of this pull request to the 3.15 branch.

@bedevere-app bedevere-app Bot removed the needs backport to 3.15 pre-release feature fixes, bugs and security fixes label Jul 8, 2026
@serhiy-storchaka serhiy-storchaka removed their assignment Jul 8, 2026
serhiy-storchaka added a commit to serhiy-storchaka/cpython that referenced this pull request Jul 8, 2026
Drop the assertion in test_create_from_named_font that explicit options
override the copied font settings: that behavior was added by pythonGH-152025
and is not in 3.15, where options are ignored when a font is specified.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
serhiy-storchaka added a commit that referenced this pull request Jul 8, 2026
… font (GH-153267) (GH-153323)

tkinter.font.Font now copies the options of a named font (via "font
configure") instead of the options resolved by "font actual", which
would resolve a size specified in pixels (a negative size) to points.
A font description is still resolved, as it cannot be parsed otherwise.

Font.copy(), which has always been equivalent to constructing a Font
from the original font, is updated to match and now preserves the size
too.


(cherry picked from commit 45010f4)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
serhiy-storchaka added a commit that referenced this pull request Jul 8, 2026
… font (GH-153267) (GH-153323) (GH-153342)

tkinter.font.Font now copies the options of a named font (via "font
configure") instead of the options resolved by "font actual", which
would resolve a size specified in pixels (a negative size) to points.
A font description is still resolved, as it cannot be parsed otherwise.

Font.copy(), which has always been equivalent to constructing a Font
from the original font, is updated to match and now preserves the size
too.

(cherry picked from commit 45010f4)
(cherry picked from commit a9d4473)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
serhiy-storchaka added a commit that referenced this pull request Jul 8, 2026
… font (GH-153267) (GH-153323) (GH-153341)

tkinter.font.Font now copies the options of a named font (via "font
configure") instead of the options resolved by "font actual", which
would resolve a size specified in pixels (a negative size) to points.
A font description is still resolved, as it cannot be parsed otherwise.

Font.copy(), which has always been equivalent to constructing a Font
from the original font, is updated to match and now preserves the size
too.

(cherry picked from commit 45010f4)
(cherry picked from commit a9d4473)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant